---------------------------------------------------
-- 充值-每周/每月礼包
-- 开服起每x天为1期

-- db.richangLibao[libaoType] = libaoData
-- libaoData.ts 				购买时间戳	
-- libaoData.list				购买记录 [id] = cnt
---------------------------------------------------

local PresentExcel = require("excel.present")
local Util = require("common.Util")
local Lang = require("common.Lang")
local CommonDB = require("common.CommonDB")
local Msg = require("core.Msg")
local Broadcast = require("broadcast.Broadcast")
local PanelDefine = require("broadcast.PanelDefine")
local Grid = require("bag.Grid")
local BagLogic = require("bag.BagLogic")
local BuyLogic = require("topup.BuyLogic")
local YunYingLogic = require("yunying.YunYingLogic")

LIBAOTYPE_WEEK = 1 			-- 每周礼包
LIBAOTYPE_MONTH = 2 		-- 每月礼包

FREE_BUY = 1 				-- 免费领取
RMB_BUY = 2 				-- rmb购买

-- 根据类型获取配置
function getConfigs(libaoType)
	if libaoType == LIBAOTYPE_WEEK then
		return PresentExcel.weekLibao
	elseif libaoType == LIBAOTYPE_MONTH then
		return PresentExcel.monthLibao
	end
end

-- 获取刷新周期 x天
function getRefreshDay(libaoType)
	if libaoType == LIBAOTYPE_WEEK then
		return 7
	elseif libaoType == LIBAOTYPE_MONTH then
		return 30
	end
end

-- 
function getLogType(libaoType)
	if libaoType == LIBAOTYPE_WEEK then
		return "week_libao"
	elseif libaoType == LIBAOTYPE_MONTH then
		return "month_libao"
	end
end

-- 获取本期礼包开始和结束时间
function getLibaoTime(libaoType)
	local openDay = CommonDB.getServerOpenDay()
	if not openDay then return end -- 没有设置开服时间 不开活动哦
	if openDay < 1 then return end -- 开服时间不对 也不开

	local refreshDay = getRefreshDay(libaoType)
	if not refreshDay then return end

	local day = openDay % refreshDay -- 本期礼包 第x天
	if day == 0 then
		day = refreshDay
	end
	local dayStartTime = Util.getDayStartTime(os.time())
	local startTime = dayStartTime - (day - 1) * 86400
	local endTime = startTime + refreshDay * 86400
	return startTime, endTime
end

-- 检查是否需要刷新
function checkDirty(human)
	if not human.db.richangLibao then
		return 
	end

	for libaoType, libaoData in pairs(human.db.richangLibao) do
		local startTime, endTime = getLibaoTime(libaoType)
		if (startTime and libaoData.ts < startTime) or 
			(endTime and libaoData.ts > endTime) then			
			human.db.richangLibao[libaoType] = nil
		end
	end
end

-- 获取已购买次数
function getBuyCnt(human, libaoType, id)
	if not human.db.richangLibao then
		return 0
	end
	local libaoData = human.db.richangLibao[libaoType]
	if not libaoData then
		return 0
	end
	return libaoData.list[id] or 0
end

-- 增加已购买次数
function addBuyCnt(human, libaoType, id)
	if not human.db.richangLibao then
		human.db.richangLibao = {}
	end
	local libaoData = human.db.richangLibao[libaoType]
	if not libaoData then
		libaoData = {}
		libaoData.ts = os.time()
		libaoData.list = {}
		human.db.richangLibao[libaoType] = libaoData
	end
	libaoData.list[id] = (libaoData.list[id] or 0) + 1
end

-- 封装礼包结构体
function fontLibaoNet(net, id, config, libaoType, human)
	net.id = id 
	net.items[0] = #config.items
	for i = 1, net.items[0] do
		local itemID = config.items[i][1]
		local itemCnt = config.items[i][2]
		Grid.makeItem(net.items[i], itemID, itemCnt)
	end
	net.name = config.name 
	net.buyItem[0] = 0
	if config.buyID > 0 then
		net.buyItem[0] = 1
		BuyLogic.fontBuyItem(human, net.buyItem[1], config.buyID)
	end
	net.cnt = getBuyCnt(human, libaoType, id)
	net.maxCnt = config.cnt
end

-- 界面查询
function sendQuery(human, libaoType)
	local startTime, endTime = getLibaoTime(libaoType)
	if not startTime then -- 没设置开服时间不开
		return Broadcast.sendErr(human, Lang.JJC_NOT_SET_OPEN_TIME)
	end 
	local configs = getConfigs(libaoType)
	if not configs then return end

	checkDirty(human)	
	local msgRet = Msg.gc.GC_RICHANG_LIBAO_QUERY
	msgRet.libaoType = libaoType
	msgRet.leftTime = endTime - os.time()
	msgRet.list[0] = #configs
	for i = 1, msgRet.list[0] do
		local config = configs[i]
		fontLibaoNet(msgRet.list[i], i, config, libaoType, human)
	end
	--Msg.trace(msgRet)
	Msg.send(msgRet, human.fd)
end

-- 购买礼包
function buyLibao(human, libaoType, id, buyType)
	local startTime, endTime = getLibaoTime(libaoType)
	if not startTime then -- 没设置开服时间不开
		return Broadcast.sendErr(human, Lang.JJC_NOT_SET_OPEN_TIME)
	end 
	local configs = getConfigs(libaoType)
	local config = configs and configs[id]
	if not config then return end

	if buyType == FREE_BUY and config.buyID > 0 then
		return -- rmb礼包不能免费领取
	end

	checkDirty(human)
	if getBuyCnt(human, libaoType, id) >= config.cnt then
		return Broadcast.sendErr(human, Lang.YUNYING_BUY_ERR_CNT)
	end

	local logType = getLogType(libaoType)
	addBuyCnt(human, libaoType, id)
	BagLogic.addItemList(human, config.items, logType)
	sendQuery(human, libaoType)
	
	if libaoType == LIBAOTYPE_WEEK then
	    for k, v in pairs(funcID) do
            YunYingLogic.updateIcon(YYInfo[k], human)
	        YunYingLogic.sendGroupUpdate(YYInfo[k], human, PanelDefine.PANEL_ID_3104)
            break
        end
	else
	    for k, v in pairs(funcID) do
            YunYingLogic.updateIcon(YYInfo[k], human)
	        YunYingLogic.sendGroupUpdate(YYInfo[k], human, PanelDefine.PANEL_ID_3207)
            break
        end
	end
end

-- 红点
function isRed(human, YYInfo, funcConfig)
	local libaoType = nil
	if funcConfig.panelID == PanelDefine.PANEL_ID_3104 then
		libaoType = LIBAOTYPE_WEEK 
	elseif funcConfig.panelID == PanelDefine.PANEL_ID_3207 then 
		libaoType = LIBAOTYPE_MONTH
	end 
	if not libaoType then return end
	local configs = getConfigs(libaoType)
	if not configs then return end

	for id, config in pairs(configs) do
		if config.buyID < 1 and 
			getBuyCnt(human, libaoType, id) < config.cnt then
			return true
		end
	end
end

-- 是否开启
function isOpen(human, YYInfo, funcConfig)
	local libaoType = nil
	if funcConfig.panelID == PanelDefine.PANEL_ID_3104 then
		libaoType = LIBAOTYPE_WEEK 
	elseif funcConfig.panelID == PanelDefine.PANEL_ID_3207 then 
		libaoType = LIBAOTYPE_MONTH
	end 
	if not libaoType or not getLibaoTime(libaoType) then
		return
	end
    local startTime, endTime = getLibaoTime(libaoType)
	return true, endTime,startTime
end



